// 在Worker线程中引入SparkMD5库
importScripts('https://cdnjs.cloudflare.com/ajax/libs/spark-md5/3.0.2/spark-md5.min.js');

// 监听主线程发送的消息
onmessage = async (e)=>{ 
    // 解构获取主线程传递的参数
    const {
            file,
            CHUNK_SIZE,
            startChunkIndex,
            endChunkIndex
        
        } = e.data;
        
    // 创建Promise数组用于存储所有切片任务
    const proms = [];
    
    // 遍历当前Worker需要处理的所有切片索引
    for (let i = startChunkIndex; i < endChunkIndex; i++){
        // 将每个切片创建任务加入Promise数组
        proms.push(createChunk(file, i, CHUNK_SIZE));
    }
    
    // 等待所有切片创建完成
    const chunks = await Promise.all(proms);
    // 将结果发送回主线程
    postMessage(chunks);
}

// 创建单个文件切片的函数
function createChunk(file, index ,chunkSize){
    // 返回一个Promise用于异步处理
    return new Promise((resolve)=>{
        // 计算当前切片在文件中的起始位置
        const start = index*chunkSize;  
        // 计算当前切片在文件中的结束位置（确保不超过文件大小）
        const end = Math.min(file.size, start + chunkSize); 
        // 创建SparkMD5实例用于计算切片的MD5值
        const spark = new SparkMD5.ArrayBuffer(); 
        // 创建FileReader用于读取文件内容
        const fileReader = new FileReader(); 
        // 从文件中切出当前切片对应的Blob数据
        const blob = file.slice(start, end); 
        
        // 监听文件读取完成事件
        fileReader.onload = (e) => { 
            // 将读取到的数据添加到MD5计算中
            spark.append(e.target.result); 
            // 解析完成，返回切片信息包括位置、数据和MD5值
            resolve({
                start,
                end,
                index,
                blob,
                hash: spark.end() // 计算并返回MD5哈希值
            });
        };
        // 以ArrayBuffer格式读取切片数据
        fileReader.readAsArrayBuffer(blob); 
    })
}